#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

// 消息结构（必须包含long mtype）
struct msg_buffer {
    long msg_type;
    char msg_text[100];
} message;

int main() {
    key_t key;
    int msgid;

    // 生成唯一key（相同路径和ID生成相同key）
    if ((key = ftok(".", 65)) == -1) {
        perror("ftok");
        exit(1);
    }

    // 创建消息队列（IPC_CREAT：不存在则创建）
    if ((msgid = msgget(key, 0644 | IPC_CREAT)) == -1) {
        perror("msgget");
        exit(1);
    }

    printf("发送端就绪，输入消息 (输入'exit'退出):\n");

    while(1) {
        printf("> ");
        fgets(message.msg_text, sizeof(message.msg_text), stdin);
        
        // 移除换行符
        message.msg_text[strcspn(message.msg_text, "\n")] = 0;
        
        // 设置消息类型（此处固定为1）
        message.msg_type = 1;
        
        // 发送消息（最后一个参数0表示阻塞发送）
        if (msgsnd(msgid, &message, sizeof(message), 0) == -1) {
            perror("msgsnd");
            break;
        }
        
        // 退出检测
        if (strcmp(message.msg_text, "exit") == 0) {
            printf("退出指令已发送\n");
            break;
        }
    }
    
    return 0;
}
